Realizar un análisis en dónde se escoja, en base a conocimientos adquiridos en clase, el mejor algoritmo de clustering para los distintos set de datos ofrecidos por el grupo docente de Minería de Datos. Utilizando para esto, los algoritmos de K-Medias y el Clustering Jerárquico.
Primero que nada es necesario que se cuentes con ciertas librerías, las cuales fueron usadas a la hora de realizar el estudio, estas librerías, más que nada, ofrecieron de un aporte en el área de la graficanción de los difrentes set de datos, lo que facilitó su estudio así como exploración.
################################################################
# Minería de Datos
# Andrea Telleria - CI: 20.614.114
# Asignacion #3: Aprendizaje no supervisado (Clustering)
################################################################
################################################################
# Instalación de Paquetes necesarios
################################################################
#Creamos la función que recibe los paquetes
install = function(pkg){
#Si ya está instalado, no lo instala.
if (!require(pkg, character.only = TRUE)) {
install.packages(pkg)
if (!require(pkg, character.only = TRUE)) stop(paste("load failure:", pkg))
}
}
install("foreach")
## Loading required package: foreach
## Warning: package 'foreach' was built under R version 3.2.3
#Seleccionamos los archivos que queremos instalar
archive = c("scatterplot3d", "rgl", "rmarkdown")
foreach(i = archive) %do% install(i)
## Loading required package: scatterplot3d
## Warning: package 'scatterplot3d' was built under R version 3.2.3
## Loading required package: rgl
## Warning: package 'rgl' was built under R version 3.2.4
## Loading required package: rmarkdown
## [[1]]
## NULL
##
## [[2]]
## NULL
##
## [[3]]
## NULL
Una vez se cuenta con las librerías, se pasa a cargar los datos que serán análizados.
################################################################
# Entrada de Datos
################################################################
a <- read.csv("a.csv", header = F)
a.big <- read.csv("a_big.csv", header = F)
good.luck <- read.csv("good_luck.csv", header = F)
moon <- read.csv("moon.csv", header = F)
h <- read.csv("h.csv", header = F)
help <- read.csv("help.csv", header = F)
s <- read.csv("s.csv", header = F)
guess <- read.csv("guess.csv", header = F)
Una vez tenermos nuestros datos pasamos a explorar nuestra data, para hacer esto se procedieron a graficar los diferentes set de datos con el fin de entender estos y así poder tomar decisiones lógicas con respecto a nuestros datos y a la forma en la que se realizaría el análisis.
################################################################
# Análisis Exploratorio: Graficando
################################################################
# Definiendo colores para 6 clusters
def_color = function(numero){
if(numero == 1)
return("mediumpurple1")
else if(numero == 2)
return("blueviolet")
else if(numero == 3)
return("magenta")
else if(numero == 4)
return("hotpink")
else if(numero == 5)
return("maroon")
else
return("plum")
}
Para ayudarnos a la hora de visualizar los sets de datos, se creó una función con la cual se manejó la paleta de colores con las que las clases serían posteriormente dibujadas. Dicha función, retorna un string con el color dado un número entero que sirva como clase.
Primero que nada se pasó a graficar el set de datos de A, sabiendo las clases de A de antemano, se realizó la función paradeterminar los colores de la gráfica con ayuda de la función sapply, luego, se realizó la misma.
# Set de Dtaos: A
# Graficado en 2D
color <- sapply(a$V3, def_color)
plot(x = a$V1, y = a$V2, col = color, pch = 20, main = "Set de Datos: A")
Como puede observarse en la gráfica pueden apreciarse tres nubes de puntos bien separadas y con aspecto circular. Estas nubes de puntos parecen bien separadas, lo que nos indica de antemano que un algoritmo como el de K-Means (K-Medias) puede ser lo mejor para este set de datos.
Como se hizo anteriormente, lo primero fue realizar una búsqueda de los colores con ayuda de la función sapply, luego, se graficó el set de datos.
# Set de Datos: A_BIG
# Graficado en 2D
color <- sapply(a.big$V3, def_color)
plot(x = a.big$V1, y = a.big$V2, col = color, pch = 20, main = "Set de Datos: A Big")
Puede verse como tanto A como A Big tienen muchas similitudes, la nube de puntos se encuentras en posiciones similares y la grafica resulta similar a la del set de datos de A, la mayor de la fiferencias es la cantidad de puntos, que produce que la separación entre las nubes de puntos no sea tan obvia y clara como en el caso del set de A.
Se puede considerar el aplicar un algoritmo como el de K-Means (K-Medias) debido a su estructura.
En este caso lo primero que se tomó en cuenta fue la cantidad de variables que se tenían, diez (10) sin contar con la varible que define la clase. Dada la alta dimencionalidad del set de datos, realizar una gráfica como las que se venían realizando no proveería de demasiada información, por lo cual se optó por un dagrama de disperción.
En este caso, no se usó de la función def_color para escoger los colores, en vez se realizón una condición con ayuda de ifelse. Esto se puedo hacer debido a la característica del set de datos, en el cual sólo pueden apreciarse dos clases.
# Set de Datos: Good_Luck
# Graficado en 2D: Diagrama de Dispersión
color <- ifelse(good.luck$V11==0, "blueviolet", "deeppink") # Colores
pairs(good.luck[1:10], main = "Set de Datos: Good Luck", pch = 20, col = color)
Puede verse como cada variable se relaciona con las demas, a su vez nos ayuda a entender que algoritmos como K-Means (K-Medias) puede resultar no muy beneficioso, análogo puede pensarse que un clustering jerárquico podría no producirnos resultados satisfactorios debido a que no se ve separación entre las clases, más allá de esto, se podría decir que las nube de puntos están encima una de otra.
Como se venía haciendo, lo primero fue darse cuenta que la clase del set de datos era discreta y que el número de clases era dos (2). Una vez se tuvo esto se pasó a definir los colores del gráfico, finalmente se graficó el set de datos.
# Set de Datos: Moon
# Graficado en 2D
color <- ifelse(moon$V3==0, "blueviolet", "deeppink") # Colores
plot(x = moon$V1, y = moon$V2, col = color, pch = 20, main = "Set de Datos: Moon")
Puede verse como cada clase tiene una estructura parecida al de una paravola, en el caso de una de las clases ésta (parábola) es concava hacía arriba y en el otro es concava hacía abajo, debido a la estructura se considera que el mejor algoritmo para tratar con el set podría ser el de clustering jerárquico, para el caso Single. Al mism tiempo no pareciese que K-Means (K-Medias) fuese la mejor solución.
para realizar graficaciones en 3D con una paleta de colores propia, primero que nada se pasó a hacer uso de una función para tratar con gráficas con claes continuas. Esto con el fin de mostrar las clases originales antes de reedefinir estas.
# Gráficos en 3D
# Función para selección de colores dónde clase es una variable continua
myColorRamp <- function(colors, values) {
v <- (values - min(values))/diff(range(values))
x <- colorRamp(colors)(v)
rgb(x[,1], x[,2], x[,3], maxColorValue = 255)
}
Análizando el set de datos H, lo primero que se hizo obvio fue la cantidad de dimensines que éste poseía, exeptuando al set de datos Good Luck, todos los set de datos hasta ahora eran de dos dimensiones con su respectiva clase, en el caso de H, cabe destacar que, primero, su clase viene dada por una variable continua y no discreta, segundo, al poseer tres dimenciones su grafica no puede ser igual a la de los otros data set.
# Data Set: H
# Con Plot3d
colors <- myColorRamp(rainbow(7), h$V4)
plot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main = "Grafico 3D: H", col = colors, pch = 19)
# Gráficado Estático
scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="3-D Scatterplot: H", pch = 20, color = colors,
angle = 75, scale.y = .5)
Con ayuda de la función para definir colores podemos colorear la grafica de tal forma que la clase continua pueda ser apreciada, de esta forma podemos entender la forma de sus datos.
Como la gráfica lo demuestra la estructura del set de datos de H, guarda similaridad con una espiral de tres dimenciones, a su vez la clase va cambiando de tal forma que en el centro de la espiral estan los valores de clase más alejados a los de los puntos más externos de la espiral.
Como no es posible realizar un análisis usando matrices de confusión sobre un set de datos con clases continueas se hizo necesario el cambiar estos valores por unos discretos, de esta forma, se hizo necesario decidir en cuántas clases dividir el intervalo y posteriormente aplicar una función que reflejase el cambio en las clases.
# Definiendo clases discretas
hist(h$V4, main = "Histograma de la Clase del Set H", col = "blueviolet", border = "plum")
definir_clase_h = function(numero){
# Seleccionando 4 cortes -> 5 clusters
if(numero < 6.0)
return(1)
else if(numero < 8.0)
return(2)
else if(numero < 10.0)
return(3)
else if(numero < 12.0)
return(4)
else
return(5)
}
# Graficación con clases discretas
h$V5 <- sapply(h$V4, definir_clase_h)
colors <- sapply(h$V5, def_color)
scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="3-D Scatterplot: H con Clases Discretas", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Para escoger las divisiones, se decidió usar las mismas que se tienen en el histograma de la variable, de esta forma, usar la trozos equidistantes en los que se divide el histograma para escoger las clases.
Una vez se escogieron los intervalos se pasó a diseñar la función con la que se aplicaría el cambio a las clases, dicho cambio fue guardado en una columna extra dentro del set de datos, a modo de no perder la clase continua de ser necesitada luego.
Una vez todo esto fue realizado se volvió a graficar la variable, esta vez con sus clases discretas.
Similar a lo que ocurre con el set de datos H, el set de datos Help tiene tres dimensiones y su clase viene dado por un intervalo continuo, sabiendo ésto se decidió usar un acercamiento análogo al caso del set de datos de H para tratar al set de datos Help.
# Data Set: Help
# Graficado con Plot3d
colors <- myColorRamp(rainbow(7), help$V4)
plot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main = "Grafico 3D: HELP", col = colors, pch = 19)
# Graficado Estático
scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="3-D Scatterplot: HELP", pch = 20, color = colors,
angle = 45, scale.y = .5)
Se usó una vez más la funció de colores para ayudar a ver qué ocurre con la variable continua que nos da información de la clase y de cómo ésta se ve.
Como la gráfica lo demuestra la estructura del set de datos de Help, se parece a la palabra SOS, dónde cada S parece ser una curva que vive en tres dimenciones y la O es una espiral entre ambas. Al mismo tiempo la manera en la que la clase está dividida es muy particular con ambas S siendo de la misma clase a pesar de que la nube de puntos que las define está muy separada. Además el centro de la espiral es la misma clase que la cola de las S.
Como lo que nos ocurre con la clase continua es parecido al dilema que ocurrió durante el análisis exploratorio del set de datos de H, resultó natural tratar el caso de forma similar.
# Definiendo clases discretas
hist(help$V4, main = "Histograma de la Clase del Set Help", col = "blueviolet", border = "plum")
definir_clase_help = function(numero){
# Seleccionando 4 cortes -> 5 clusters
if(numero < 0.0)
return(1)
else if(numero < 5.0)
return(2)
else if(numero < 10.0)
return(3)
else
return(4)
}
# Graficación con clases discretas
help$V5 <- sapply(help$V4, definir_clase_help)
colors <- sapply(help$V5, def_color)
scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="3-D Scatterplot: HELP con Clases Discretas", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Para escoger las divisiones, se decidió usar las misma estrategía anterior, así pues el histograma de la variable nos dio la información de los trozos en los que se dividió la clase posteriormente.
Una vez se escogieron los intervalos se pasó a diseñar la función con la que se aplicaría el cambio a las clases, dicho cambio fue guardado en una columna extra dentro del set de datos, a modo de no perder la clase continua de ser necesitada luego.
Una vez todo esto fue realizado se volvió a graficar la variable, esta vez con sus clases discretas.
el set de datos S, similar a los dos anteriores vive en tres dimenciones con su clase definida por un intervalo continuo. Así pues se realizó la estrategía prevía.
# Data Set: S
# Graficado con Plot3d
colors <- myColorRamp(rainbow(7), s$V4)
plot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main = "Grafico 3D: S", col = colors, pch = 19)
# Graficado Estático
scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="3-D Scatterplot: S", pch = 20, color = colors,
angle = 45, scale.y = .5)
Se usó una vez más la funció de colores para ayudar a ver qué ocurre con la variable continua que nos da información de la clase y de cómo ésta se ve.
Como la gráfica lo demuestra, la estructura del set de datos de S, se parece a la letra S, esta S que vive en tres dimenciones tiene la característica e que su clase es diferente a lo largo de toda la letra, comenzando en un color y terminando en otro. En este aspecto se puede mencionar su parecido con las S’s que forman parte del set de datos de Help.
Como lo que nos ocurre con la clase continua es parecido al dilema que ocurrió durante el análisis exploratorio del set de datos de H y Help, resultó natural tratar el caso de forma similar.
# Definiendo clases discretas
hist(s$V4, main = "Histograma de la Clase del Set S", col = "blueviolet", border = "plum")
definir_clase_s = function(numero){
if(numero < -4.0)
return(1)
else if(numero < -2.0)
return(2)
else if(numero < 0.0)
return(3)
else if(numero < 4.0)
return(4)
else
return(5)
}
# Aplicando la función y sustituyendo el valor continuo por uno discreto
s$V5 <- sapply(s$V4, definir_clase_s)
colors <- sapply(s$V5, def_color)
scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="3-D Scatterplot: S con Clases Discretas", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Para escoger las divisiones, se decidió usar las misma estrategía que se venía usando, así pues el histograma de la variable nos dio la información de los trozos en los que se dividió la clase posteriormente.
Una vez se escogieron los intervalos se pasó a diseñar la función con la que se aplicaría el cambio a las clases, dicho cambio fue guardado en una columna extra dentro del set de datos, a modo de no perder la clase continua de ser necesitada luego.
Una vez todo esto fue realizado se volvió a graficar la variable, esta vez con sus clases discretas.
Este set de datos tiene una particularidad que no comparte con ninguno de los demás, esta particularidad es el hecho de que no se tiene una variable con la clase a la que pertenecen los individuos que conforman el set. Así pues nos limitaremos a graficarlo para ver la forma en la que la nube de puntos está organizada.
# Data Set: Guess
# Grafica en 2D
plot(x = guess$V1, y = guess$V2, col = "blueviolet", pch = 20, main = "Set de Datos: Guess")
A simple vista puede verse como hay dos nubes de puntos, aunque si se estudia con más cuidado puede parecer también que la nube de puntos más grandes no es más que varias nubes de puntos con poca separación entre ellas, hasta el punto en el que pareciesen una. A su vez, dada la estructura de las nubes la cual parece ligeramente elíptica el algoritmo de K-Means (K-Medias) puede resultar bueno a la hora de aplicar algoritmos de clustering al set de datos.
Primero que nada se creo una variable en la cual no se tomase en cuenta la variable referente a la clase para no tener problemas a la hora de aplicar os métodos, en el caso de las varibles dónde se tienen más de una columna referente a ésta (caso de clases continuas y discretas), ambas fueron dejadas de lado de forma que no afectasen el algoritmo de clustering.
################################################################
# Clustering
################################################################
# Primero que nada eliminamos la columna con la clase para poder aplicar los métodos de clustering
a1 <- a[-c(3)]
a.big1 <- a.big[-c(3)]
good.luck1 <- good.luck[-c(11)]
h1 <- h[-c(4, 5)]
help1 <- help[-c(4, 5)]
moon1 <- moon[-c(3)]
s1 <- s[-c(4, 5)]
A continuación se mostrará los resultados de aplicarse el método de K-Means a los diferentes set de datos.
# Set de Datos: A
# Aplicando el método K-Means
k <- kmeans(a1, 3, iter.max = 500)
color <- sapply(k$clust, def_color)
plot(a1, col=color, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
table(k$cluster, a$V3)
##
## 0 1 2
## 1 0 1000 0
## 2 0 0 999
## 3 1000 0 1
# Set de Datos: A
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(-20,18),
c(-20,20),
c(-20,10))
k <- kmeans(a1, centers = init.c, iter.max = 500)
color <- sapply(k$clust, def_color)
plot(a1, col=color, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
table(k$cluster, a$V3)
##
## 0 1 2
## 1 1000 0 1
## 2 0 0 999
## 3 0 1000 0
Como puede observarse el resultado de K-Means resulta muy bueno en el caso del set de A debido a la forma que tienen las nubes de puntos. Esto además puede verse reflejado en la tabla que funciona como matriz de confusión, ya sea dando puntos o no, el algoritmo tiende a converger en una solución que resulta muy buena para el set de datos que se tiene.
En el caso de esta tabla hay que resaltar que debido a las características de K-means es imposible predecir que clase va a considerarse con cual nombre, por ejemplo al momento del clustering, la clase que viene definida por el número uno (1), puede ser considerada como parte del clsuter dos (2), pero por la manera en la que éste clsuter se ve dibujado se puede asumir que es el cluster que refleja las características de la clase uno (1).
Por esto, a la hora de realizar la matriz de confusión es necesario tener esto en cuenta para no cometer errores cuando se lee la misma. Los nombres que se les da a las clases muchas veces no son los nombres de los clusters, de hecho, raramente son los mismos.
Para realizar el análisis sobre este set de datos se tuvieron que tener en cuenta ciertos puntos. El primero es la utilización de una implementación de K-Means con el fin de estudiar cómo trabaja el algoritmo para set de datos muy grandes.
Sabemos que, para casos como estos lo más importante es hacer que el algoritmo converja con rapidez, para lograr esto tomar una muestra, descbrir sus centros y luego usarlos sobre el set de datos entero es lo más lógico.
Sabiendo, además, que contamos con una muestra (set de datos A), pasaremos a utilizar los centros generados al aplicar kmeans de A para ayudar a que el algorimo converja con rapidez en el caso de A Big.
# Función de distancia, en este caso, Euclideana
euclidean.dist <- function(x1, x2) {
distanceMatrix <- matrix(NA, nrow=dim(x1)[1], ncol=dim(x2)[1])
for(i in 1:nrow(x2)) {
distanceMatrix[,i] <- sqrt(rowSums(t(t(x1)-x2[i,])^2))
}
distanceMatrix
}
# K-Means, dónde Iter es el número de Iteraciones
K.Means <- function(x, centers, fun.dist, Iter) {
clusterHistory <- vector(Iter, mode="list")
centerHistory <- vector(Iter, mode="list")
for(i in 1:Iter) {
distsACenters <- fun.dist(x, centers)
clusters <- apply(distsACenters, 1, which.min)
centers <- apply(x, 2, tapply, clusters, mean)
clusterHistory[[i]] <- clusters
centerHistory[[i]] <- centers
}
list(clusters = clusterHistory, centers = centerHistory)
}
Primero que nada se tiene una función que dado una lista con los diferentes centros y una matriz con los datos, pudiese calcular la matriz de distancia. Es importante que la entrada sea de esa forma. Esta matriz de distancia funciona con la distancia Euclideana, la cual calcula mediante el uso de transposición de matrices, funciones como rowsum y sqrt.
La función K.Means trabaja con los centros, la data (la cual debe ser una matriz), el número de iteraciones y el nombre de la función de distancia a utilizar. Con esto se crea una matriz a la que se le van añadiendo como niveles las actualizaciones realizadas con cada iteración. De esta forma se van guardando los cambios realizados, con ésto si se desea acceder a la última versión de los datos, se usa el nivel que resulta de la iteración.
# En el caso de usar los centros de A
a.big1 <- as.matrix(a.big1)
k <- kmeans(a1, 3, iter.max = 500)
centers <- k$centers
res <- K.Means(a.big1, centers, euclidean.dist, 10)
color <- sapply(res$clusters[[10]], def_color)
plot(a.big1, col=color, pch=19)
# Con centros aleatorios
centers <- a.big1[sample(nrow(a.big1), 3),]
res <- K.Means(a.big1, centers, euclidean.dist, 10)
color <- sapply(res$clusters[[10]], def_color)
plot(a.big1, col=color, pch=19)
Debido a que el algorimo no cuenta con una forma de detectar los cambios (o carencia de cambios) mediante algún tipo de tolerancia no es posible apreciar el que, dados los centros el algorimo se torne perceptívamente más rápido, sin embargo, puede apreciarse como si es verdad que trabaja mejor, pudiendo llegar a ser más preciso con la misma cantidad de iteraciones.
La nube de puntos, al ser similar a la de A, con una forma elíptica y con distancia entre puntos se puede considerar como un perfecto ejemplo de lo que sería un set de datos ideal para la aplicación de K-Means, sabiendo ésto no es de extrañar que el algoritmo de clustering retorne una solución satisfactoria.
# Set de Datos: good_luck
# Aplicando PCA para reducir dimensionalidad
good.luck.pca <- prcomp(good.luck1,
center = TRUE,
scale. = TRUE)
summary(good.luck.pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.0966 1.0588 1.0261 1.0203 1.0097 0.99326 0.97507
## Proportion of Variance 0.1202 0.1121 0.1053 0.1041 0.1019 0.09866 0.09508
## Cumulative Proportion 0.1202 0.2324 0.3377 0.4417 0.5437 0.64236 0.73744
## PC8 PC9 PC10
## Standard deviation 0.97283 0.93716 0.8950
## Proportion of Variance 0.09464 0.08783 0.0801
## Cumulative Proportion 0.83208 0.91990 1.0000
Primero que nada se pensó en aplicar PCA para así redcir las dimenciones, dadas las características de PCA se pensó además en encontrar una forma de hacer los datos más separables de forma que se pudiese realizar un algoritmo de clustering con un resultado positivo, al realizarse la función PAC sobre los datos, fue obvio que esto no era posible.
De las diez (10) variables que se tienen (dónde la onceaba fue eliminada ya que era la que proveía la información de las clases), todas aportan información, de esta manera la aplicación de PCA no implica beneficios. De todas formas se considera que es información interesante a la hora de entender el set de datos el saber cuánta importancia lleva cada variable.
# Aplicando el método K-Means sobre set original
# Aplicando el método K-Means
k <- kmeans(good.luck1, 2, iter.max = 500)
color <- ifelse(k$clust==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19)
table(k$cluster, good.luck$V11)
##
## 0 1
## 1 271 231
## 2 242 256
# Aplicando el método K-Means sobre good.luck.pca
# Aplicando el método K-Means
k <- kmeans(good.luck.pca$x, 2, iter.max = 500)
color <- ifelse(k$clust==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19)
table(k$cluster, good.luck$V11)
##
## 0 1
## 1 292 276
## 2 221 211
Primero se le aplicó el K-Means al set de datos original, es decir, sin haberle aplicado aún la función prcomp, el resultado obtenido,como era de esperarse, no fue muy bueno, esto sin duda, se debe a la nula separación que hay entre las variables, con este tipo de set de datos, K-Means mo resulta el algoritmo óptimo.
Luego se aplicó nuevamente K-Means, pero en este caso, sobre los componentes principales previamente hayados, debido a la importancia que se le dio a las columnas fue imposible deshacernos de ninguna a la hora de realizar el estudio, por lo cual, como era de esperarse los datos no distaron mucho de los obtenidos de aplicar el K-Means sobre el set de datos original. Si acaso, hubo una mejora de no más de cinco individuos los cuales (si tomamos como que el mayor número de cluster es la clase y el otro los errores) no fueron mal clasificados.
En este ejemplo no resultó plausible escoger centros para observar la forma en la que reaccionaba el algoritmo, más que nada debido a la cantidad de dimenciones que se tienen las cuales convierten del set de datos en un problema mucho más complicado de lo que podría imaginarse.
# Set de Datos: Moon
# Aplicando el método K-Means
k <- kmeans(moon1, 2, iter.max = 500)
color <- ifelse(k$clust==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
table(k$cluster, moon$V3)
##
## 0 1
## 1 123 379
## 2 377 121
# Set de Datos: Moon
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(1,2),
c(-1,-1))
k <- kmeans(moon1, centers = init.c, iter.max = 500)
color <- ifelse(k$clust==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
table(k$cluster, moon$V3)
##
## 0 1
## 1 123 379
## 2 377 121
Como se predijo durante el análisis exploratorio, para este set de datos el método de K-Means resulta en un gran número de errores, como se demuestra con las matrices de confusión, esto se debe a la forma que tiene el set, el cual es alargado siguiendo la forma de parabolas.
Se sabe que el método de K-Means da mejores resultados cuando las nubes de puntos estan separadas y tienen formas elípticas, como el set Moon no tiene este tipo de forma no es de extrañar el resultado obtenido.
Incluso escogiendo centros éstos tienden a converger más rápido, pero sobre los mismos lugares de si se dejan puntos iniciales aleatorios.
# Set de Datos: H
# Aplicando el método K-Means
k <- kmeans(h1, 5, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="K-Mean: H", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, h$V5)
##
## 1 2 3 4 5
## 1 77 19 0 85 20
## 2 63 55 0 42 73
## 3 0 0 108 74 0
## 4 0 90 35 0 92
## 5 0 55 71 0 41
# Set de Datos: H
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(10,10,5),
c(0,5,5),
c(-10,10,5),
c(0,5,0),
c(0,5,-10))
k <- kmeans(h1, centers = init.c, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="K-Mean: H", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, h$V5)
##
## 1 2 3 4 5
## 1 0 99 18 0 99
## 2 0 88 25 0 82
## 3 0 0 171 25 0
## 4 66 16 0 92 18
## 5 74 16 0 84 27
Para este set de datos el método de K-Means resulta en un número de errores no despreciables, como se demuestra con las matrices de confusión, esto se debe a la forma que tiene el set similar al caso del set de Moon, el cual al no tener una estructura conveniente termina causando que el método no resulte con un modeo satisfactorio.
Aún con centros, el algoritmo siempre tiende a acercarse a los mismos puntos, dividiendo la espiral, no por tramos como debería, sino por secciones en las que se hubican las centros de las esferas. Cabe destacar que lo que K-Means trata de hacer cuando se trata de clustering en tres dimenciones (3D), se basa en minimizar y unificar ángulos entre componentes, además de necesitar que los puntos estén separados para funcionar mejor.
# Set de Datos: HELP
# Aplicando el método K-Means
k <- kmeans(help1, 4, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(help1$V1, # x axis
help1$V2, # y axis
help1$V3, # z axis
main="K-Mean: HELP", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, help$V5)
##
## 1 2 3 4
## 1 506 32 0 0
## 2 506 494 0 0
## 3 0 30 543 427
## 4 0 462 0 0
# Set de Datos: HELP
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(0,10,0),
c(60,10,0),
c(25,10,0),
c(25,10,-10))
k <- kmeans(help1, centers = init.c, iter.max = 500)
k <- kmeans(help1, 4, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(help1$V1, # x axis
help1$V2, # y axis
help1$V3, # z axis
main="K-Mean: HELP", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, help$V5)
##
## 1 2 3 4
## 1 506 494 0 0
## 2 0 462 0 0
## 3 506 32 0 0
## 4 0 30 543 427
Para este set de datos el método de K-Means resulta en un número de errores muy alto, como se demuestra con las matrices de confusión, esto se debe a la forma que tiene el set, ya que si bien ambas Ss forman parte de la misma clase, se encuentras distanciadas entre ellas, este tipo de nube de puntos es muy complicada a la hora de realizar clustering. La mejor opción seria considerar ambas Ss como clusters separados que es lo que el algoritmo trata de hacer, al final resulta imposible, incluso pasando centros como parámetros, que el resultado de K-Means sea un modelo satifactorio.
# Set de Datos: S
# Aplicando el método K-Means
k <- kmeans(s1, 5, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(s1$V1, # x axis
s1$V2, # y axis
s1$V3, # z axis
main="K-Mean: S", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, s$V5)
##
## 1 2 3 4 5
## 1 0 90 130 0 0
## 2 75 125 0 0 0
## 3 0 0 0 189 0
## 4 0 0 0 119 84
## 5 0 0 97 91 0
# Set de Datos: S
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(-1,1,-2),
c(1,1,2),
c(0.4,0.5,1),
c(0.5,1,-0.5),
c(0,1,2))
k <- kmeans(s1, centers = init.c, iter.max = 500)
k <- kmeans(s1, 5, iter.max = 500)
colors <- sapply(k$clust, def_color)
h.plot <- scatterplot3d(s1$V1, # x axis
s1$V2, # y axis
s1$V3, # z axis
main="K-Mean: S", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
h.plot$points3d(k$centers, pch = 19, col = "navy", cex = 1.5)
table(k$cluster, s$V5)
##
## 1 2 3 4 5
## 1 0 0 0 211 0
## 2 0 0 118 58 0
## 3 0 95 109 0 0
## 4 0 0 0 130 84
## 5 75 120 0 0 0
Es interesante como para este set de datos, si bien K-Means no resulta en un buen método no es tan malo como podría pensarse tampoco, dado la forma de las clases el algoritmo resulta en uno que si bien clasifica muy mal ciertas clases para otras no resulta tan malo. Esto puede apreciarse bien si se ve la matriz de confusión resultante.
Cabe destacar que dados los centros, el algoritmo, similar a o que viene ocurriendo hasta ahora en el estudio, no cambia mucho con respecto a dejar que sean aleatorios.
Como se mencionó una vez el set de datos Guess* resulta bastante especial, esto se debe a que no tiene una variable que me defina la clase, es por esto que realizar un modelo con Guess implica tomar cieertas deciciones.
# Set de Datos: Guess
# Aplicando el método K-Means
# Buscando antidad óptima de clusters
wss <- (nrow(guess)-1)*sum(apply(guess,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(guess, centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Numero de Clusters", ylab="Suma de Cuadrados",
main = "Codo de Jambú: Guess", col = "blueviolet")
La primera se presentó como la cantidad de clsuters en los que se planeaba dividir la data, como se dijo en un momento al realizar el estudio exploratorio hay dos formas de ver la gráfica de de Guess, la primera es como dos nubes de puntos y la segunda es como más de dos nubes de puntos en este caso hay varias nubes de puntos sin distancia entre ellas.
Para estar seguro sobre el número de clusters se realizó el método del codo de Jambú, el cual hace uso del SSE (Sum of Squared Error, Suma del Cuadrado de los Errores) de diferentes K-Means para detectar un óptimo número de clusters.
Haciendo uso de éste método para escoger K, se detecó que el mejor número era 4~5 clusters, como puede observarse en la gráfica. Así pues se decidióusar cuatro (4) como número de clusters.
# Aplicando K-Means con 5 Clusters
k <- kmeans(guess, 4, iter.max = 500)
colors <- sapply(k$clust, def_color)
plot(guess, col=colors, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
# Set de Datos: S
# Aplicando el método K-Means con centros dados
init.c <- rbind(c(-20,-20),
c(-20,20),
c(20,0),
c(45,45))
k <- kmeans(guess, centers = init.c, iter.max = 500)
plot(guess, col=colors, pch=19)
points(k$centers, pch = 19, col = "navy", cex = 1)
La aplicación de K-Means parece resultar en grupos bien definidos con un ligero parecido a lo que podría apreciarse si se hubiese pensado en la nube de puntos de mayor tamaño como un conjunto de puntos.
################################################################
# Clustering Jerarquico
################################################################
A continuación, siguen las soluciones encontradas después de aplicar clustering jerárquico a los diferentes set de datos que se tenían.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análicisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: A
# Buscamos la distancia
distancia1 = dist(a1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia1, method = "single")
plot(cluster1, main = "Cluster de A: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia1, method = "complete")
plot(cluster2, main = "Cluster de A: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia1, method = "average")
plot(cluster3, main = "Cluster de A: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia1, method = "ward.D")
plot(cluster4, main = "Cluster de A: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia1, method = "ward.D2")
plot(cluster5, main = "Cluster de A: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia1, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia1, method = "median")
plot(cluster7, main = "Cluster de A: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia1, method = "centroid")
plot(cluster8, main = "Cluster de A: Método Centroid", col = "blueviolet")
A simple vista pareciese que la mayoría de los dendogramas tienen cierto aspecto parecido, pudiendo apreciar tres clases principales.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 3)
table(t1, a$V3)
##
## t1 0 1 2
## 1 999 1000 999
## 2 1 0 0
## 3 0 0 1
color <- sapply(t1, def_color)
plot(a1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 3)
table(t2, a$V3)
##
## t2 0 1 2
## 1 0 1000 47
## 2 1000 0 6
## 3 0 0 947
color <- sapply(t2, def_color)
plot(a1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 3)
table(t3, a$V3)
##
## t3 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t3, def_color)
plot(a1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 3)
table(t4, a$V3)
##
## t4 0 1 2
## 1 0 1000 2
## 2 998 0 0
## 3 2 0 998
color <- sapply(t4, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 3)
table(t5, a$V3)
##
## t5 0 1 2
## 1 0 1000 2
## 2 998 0 0
## 3 2 0 998
color <- sapply(t5, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 3)
table(t6, a$V3)
##
## t6 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t6, def_color)
plot(a1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 3)
table(t7, a$V3)
##
## t7 0 1 2
## 1 0 988 0
## 2 1000 12 999
## 3 0 0 1
color <- sapply(t7, def_color)
plot(a1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 3)
table(t8, a$V3)
##
## t8 0 1 2
## 1 0 1000 12
## 2 999 0 0
## 3 1 0 988
color <- sapply(t8, def_color)
plot(a1, col=color, pch=19, main = "Método Centroid")
Si bien la mayoría de los casos pueden distinguirse bien los tres grupos de nubes de puntos, siempre hay un más alto indice de error que si aplicamos K-Means, cabe destacar que hay algunos métodos de clustering jerárquico que son muy malos para este data set, se resalta el performance del método Single y Median.
# Set de datos: A
# Buscamos la distancia
distancia1 = dist(a1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia1, method = "single")
plot(cluster1, main = "Cluster de A: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia1, method = "complete")
plot(cluster2, main = "Cluster de A: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia1, method = "average")
plot(cluster3, main = "Cluster de A: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia1, method = "ward.D")
plot(cluster4, main = "Cluster de A: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia1, method = "ward.D2")
plot(cluster5, main = "Cluster de A: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia1, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia1, method = "median")
plot(cluster7, main = "Cluster de A: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia1, method = "centroid")
plot(cluster8, main = "Cluster de A: Método Centroid", col = "blueviolet")
Igual que lo ocurrido con anterioridad, pueden verse ciertas similitudes entre la mayoría de los dendográmas, con alguna que otra exepción (por ejemplo, el dendográma del método Single).
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 3)
table(t1, a$V3)
##
## t1 0 1 2
## 1 999 1000 999
## 2 1 0 0
## 3 0 0 1
color <- sapply(t1, def_color)
plot(a1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 3)
table(t2, a$V3)
##
## t2 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t2, def_color)
plot(a1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 3)
table(t3, a$V3)
##
## t3 0 1 2
## 1 0 1000 2
## 2 1000 0 9
## 3 0 0 989
color <- sapply(t3, def_color)
plot(a1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 3)
table(t4, a$V3)
##
## t4 0 1 2
## 1 0 1000 2
## 2 998 0 0
## 3 2 0 998
color <- sapply(t4, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 3)
table(t5, a$V3)
##
## t5 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t5, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 3)
table(t6, a$V3)
##
## t6 0 1 2
## 1 0 995 0
## 2 999 0 2
## 3 1 5 998
color <- sapply(t6, def_color)
plot(a1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 3)
table(t7, a$V3)
##
## t7 0 1 2
## 1 0 1000 2
## 2 1000 0 206
## 3 0 0 792
color <- sapply(t7, def_color)
plot(a1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 3)
table(t8, a$V3)
##
## t8 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t8, def_color)
plot(a1, col=color, pch=19, main = "Método Centroid")
Como puede observarse en la mayoría de los casos, el cambio en el uso de la distancia implicóuna mejora, aún a pesar de esto puede seguir considerándose como mejor opción el uso de K-Means para este data set.
# Set de datos: A
# Buscamos la distancia
distancia1 = dist(a1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia1, method = "single")
plot(cluster1, main = "Cluster de A: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia1, method = "complete")
plot(cluster2, main = "Cluster de A: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia1, method = "average")
plot(cluster3, main = "Cluster de A: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia1, method = "ward.D")
plot(cluster4, main = "Cluster de A: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia1, method = "ward.D2")
plot(cluster5, main = "Cluster de A: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia1, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia1, method = "median")
plot(cluster7, main = "Cluster de A: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia1, method = "centroid")
plot(cluster8, main = "Cluster de A: Método Centroid", col = "blueviolet")
Igual que lo ocurrido con anterioridad, pueden verse ciertas similitudes entre la mayoría de los dendográmas, apeciándose que hay tres clusters bien diferenciados.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 3)
table(t1, a$V3)
##
## t1 0 1 2
## 1 999 1000 999
## 2 1 0 0
## 3 0 0 1
color <- sapply(t1, def_color)
plot(a1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 3)
table(t2, a$V3)
##
## t2 0 1 2
## 1 0 1000 2
## 2 1000 0 7
## 3 0 0 991
color <- sapply(t2, def_color)
plot(a1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 3)
table(t3, a$V3)
##
## t3 0 1 2
## 1 0 1000 2
## 2 1000 0 6
## 3 0 0 992
color <- sapply(t3, def_color)
plot(a1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 3)
table(t4, a$V3)
##
## t4 0 1 2
## 1 0 1000 2
## 2 998 0 0
## 3 2 0 998
color <- sapply(t4, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 3)
table(t5, a$V3)
##
## t5 0 1 2
## 1 0 998 2
## 2 999 0 1
## 3 1 2 997
color <- sapply(t5, def_color)
plot(a1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 3)
table(t6, a$V3)
##
## t6 0 1 2
## 1 0 1000 2
## 2 999 0 0
## 3 1 0 998
color <- sapply(t6, def_color)
plot(a1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 3)
table(t7, a$V3)
##
## t7 0 1 2
## 1 0 998 0
## 2 1000 0 90
## 3 0 2 910
color <- sapply(t7, def_color)
plot(a1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 3)
table(t8, a$V3)
##
## t8 0 1 2
## 1 0 998 0
## 2 999 0 1
## 3 1 2 999
color <- sapply(t8, def_color)
plot(a1, col=color, pch=19, main = "Método Centroid")
Se puede decir que con este tipo de distancia se consiguió que entre métodos la variaciones de las respuestas fuesen menor que en casos anteriores, en este caso, el método de Median mostró cierta mejora, aún así la tasa de error sigue siendo mayor a la que se obtiene con el uso de K-Means.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análicisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: Good Luck
# Buscamos la distancia
distancia2 = dist(good.luck1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia2, method = "single")
plot(cluster1, main = "Cluster de Good Luck: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia2, method = "complete")
plot(cluster2, main = "Cluster de Good Luck: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia2, method = "average")
plot(cluster3, main = "Cluster de Good Luck: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia2, method = "ward.D")
plot(cluster4, main = "Cluster de Good Luck: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia2, method = "ward.D2")
plot(cluster5, main = "Cluster de Good Luck: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia2, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia2, method = "median")
plot(cluster7, main = "Cluster de Good Luck: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia2, method = "centroid")
plot(cluster8, main = "Cluster de Good Luck: Método Centroid", col = "blueviolet")
Para este set de datos los dendográmas tienen formas muy particulares, donde los que se ven mejor serían los del método Ward.D y Ward.D2.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 2)
table(t1, good.luck$V11)
##
## t1 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, good.luck$V11)
##
## t2 0 1
## 1 467 409
## 2 46 78
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, good.luck$V11)
##
## t3 0 1
## 1 513 485
## 2 0 2
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, good.luck$V11)
##
## t4 0 1
## 1 223 223
## 2 290 264
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, good.luck$V11)
##
## t5 0 1
## 1 266 259
## 2 247 228
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, good.luck$V11)
##
## t6 0 1
## 1 488 445
## 2 25 42
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, good.luck$V11)
##
## t7 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, good.luck$V11)
##
## t8 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Centroid")
Si bien los dendográmas de Ward.D y Ward.D2 parecían ser a simple vista decentes, se demostró que no lo eran mucho cuando llegó la hora de ver las tablas de confusión asciadas, de hecho de todos los métodos de clustering jerárquico ninguno fue bueno. El mejor podría considerarse como el del método Average y Ward.D2, aunque al final, la tasa de error tiene a ser tan alta como la tasa de acierto.
# Set de datos: Good Luck
# Buscamos la distancia
distancia2 = dist(good.luck1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia2, method = "single")
plot(cluster1, main = "Cluster de Good Luck: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia2, method = "complete")
plot(cluster2, main = "Cluster de Good Luck: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia2, method = "average")
plot(cluster3, main = "Cluster de Good Luck: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia2, method = "ward.D")
plot(cluster4, main = "Cluster de Good Luck: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia2, method = "ward.D2")
plot(cluster5, main = "Cluster de Good Luck: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia2, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia2, method = "median")
plot(cluster7, main = "Cluster de Good Luck: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia2, method = "centroid")
plot(cluster8, main = "Cluster de Good Luck: Método Centroid", col = "blueviolet")
Como en el caso anterior hay algunos dendográmas con formas atípicas, pero en la mayoría no se puede apreciar mucho debido a la cantidad de data.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 2)
table(t1, good.luck$V11)
##
## t1 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, good.luck$V11)
##
## t2 0 1
## 1 496 449
## 2 17 38
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, good.luck$V11)
##
## t3 0 1
## 1 513 484
## 2 0 3
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, good.luck$V11)
##
## t4 0 1
## 1 280 257
## 2 233 230
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, good.luck$V11)
##
## t5 0 1
## 1 250 252
## 2 263 235
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, good.luck$V11)
##
## t6 0 1
## 1 513 484
## 2 0 3
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, good.luck$V11)
##
## t7 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, good.luck$V11)
##
## t8 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Centroid")
En la mayoría de los casos el cambio en la distancia no trajo mucha diferencia. El único caso que es rescatable es lo ocurrido con el método Ward.D y Ward.D2, en el caso del primero el cambio de la distancia significó una gran mejora (aunque sigue equivocándose en alrededor de la mitad de los casos), mientras que en el caso del segundo empeoró mucho. Tanto así que se puede decir que es tan malo como el resto.
Los mejores con la distancia Maximum fueron así, Avarage que pareció empeorar un poco y Ward.D que mejoró apreciativamente.
# Set de datos: Good Luck
# Buscamos la distancia
distancia2 = dist(good.luck1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia2, method = "single")
plot(cluster1, main = "Cluster de Good Luck: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia2, method = "complete")
plot(cluster2, main = "Cluster de Good Luck: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia2, method = "average")
plot(cluster3, main = "Cluster de Good Luck: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia2, method = "ward.D")
plot(cluster4, main = "Cluster de Good Luck: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia2, method = "ward.D2")
plot(cluster5, main = "Cluster de Good Luck: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia2, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia2, method = "median")
plot(cluster7, main = "Cluster de Good Luck: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia2, method = "centroid")
plot(cluster8, main = "Cluster de Good Luck: Método Centroid", col = "blueviolet")
Igual que lo ocurrido con anterioridad, hay dendográmas que tienen formas muy particulares con alguno que otro mostrando una estructura de árbol.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 2)
table(t1, good.luck$V11)
##
## t1 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, good.luck$V11)
##
## t2 0 1
## 1 354 334
## 2 159 153
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, good.luck$V11)
##
## t3 0 1
## 1 513 481
## 2 0 6
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, good.luck$V11)
##
## t4 0 1
## 1 238 282
## 2 275 205
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, good.luck$V11)
##
## t5 0 1
## 1 317 258
## 2 196 229
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, good.luck$V11)
##
## t6 0 1
## 1 513 483
## 2 0 4
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, good.luck$V11)
##
## t7 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, good.luck$V11)
##
## t8 0 1
## 1 513 486
## 2 0 1
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(good.luck1, col=color, pch=19, main = "Método Centroid")
Con este tipo de distancia se consiguieron ciertas mejoras con respecto al método Complete, que en casos anteriores no había mostrado mucho, para el método Ward.D se mostraron ciertas mejoras, y para el caso Avarage mostró empeorar.
Para el caso Ward.D2 puede decirse que fue el mejor de todos, aunque no resulta muy alentador si uno decide mirar de cerca la matriz de confusión.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: Moon
# Buscamos la distancia
distancia3 = dist(moon1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia3, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia3, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia3, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia3, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia3, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia3, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia3, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia3, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Puedieron verse las graficas de los dendográmas para el caso de distancia euclideana.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 2)
table(t1, moon$V3)
##
## t1 0 1
## 1 500 0
## 2 0 500
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, moon$V3)
##
## t2 0 1
## 1 393 57
## 2 107 443
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, moon$V3)
##
## t3 0 1
## 1 266 500
## 2 234 0
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, moon$V3)
##
## t4 0 1
## 1 344 0
## 2 156 500
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, moon$V3)
##
## t5 0 1
## 1 500 173
## 2 0 327
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, moon$V3)
##
## t6 0 1
## 1 500 284
## 2 0 216
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, moon$V3)
##
## t7 0 1
## 1 420 173
## 2 80 327
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, moon$V3)
##
## t8 0 1
## 1 344 0
## 2 156 500
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Centroid")
Como se predijo, durante el análisis exploratorio el mejor método para este set de datos es el Single, puede verse perfectamente como pudo distingir entre las dos estructuras perfectamente. Para cosos como este es donde se demuestran los lados positivos del método.
# Set de datos: Moon
# Buscamos la distancia
distancia3 = dist(moon1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia3, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia3, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia3, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia3, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia3, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia3, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia3, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia3, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse la graficación de los diferentes dendográmas.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 2)
table(t1, moon$V3)
##
## t1 0 1
## 1 500 0
## 2 0 500
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, moon$V3)
##
## t2 0 1
## 1 468 205
## 2 32 295
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, moon$V3)
##
## t3 0 1
## 1 500 262
## 2 0 238
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, moon$V3)
##
## t4 0 1
## 1 272 500
## 2 228 0
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, moon$V3)
##
## t5 0 1
## 1 272 500
## 2 228 0
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, moon$V3)
##
## t6 0 1
## 1 500 348
## 2 0 152
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, moon$V3)
##
## t7 0 1
## 1 500 293
## 2 0 207
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, moon$V3)
##
## t8 0 1
## 1 272 500
## 2 228 0
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Centroid")
No hubieron muchos cambios con respecto al uso de la distancia euclideana. Nuevamente el mejor método fue el Single.
# Set de datos: Moon
# Buscamos la distancia
distancia3 = dist(moon1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia3, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia3, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia3, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia3, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia3, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia3, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia3, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia3, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse los diferentes gráficos de los dendográmas, pasaremos pues a verificar las soluciones con ayuda de la matriz de confusión.
t1=cutree(cluster1, k = 2)
table(t1, moon$V3)
##
## t1 0 1
## 1 500 0
## 2 0 500
color <- ifelse(t1==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 2)
table(t2, moon$V3)
##
## t2 0 1
## 1 344 80
## 2 156 420
color <- ifelse(t2==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 2)
table(t3, moon$V3)
##
## t3 0 1
## 1 394 123
## 2 106 377
color <- ifelse(t3==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 2)
table(t4, moon$V3)
##
## t4 0 1
## 1 373 99
## 2 127 401
color <- ifelse(t4==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 2)
table(t5, moon$V3)
##
## t5 0 1
## 1 373 108
## 2 127 392
color <- ifelse(t5==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 2)
table(t6, moon$V3)
##
## t6 0 1
## 1 349 155
## 2 151 345
color <- ifelse(t6==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 2)
table(t7, moon$V3)
##
## t7 0 1
## 1 420 155
## 2 80 345
color <- ifelse(t7==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 2)
table(t8, moon$V3)
##
## t8 0 1
## 1 342 99
## 2 158 401
color <- ifelse(t8==1, "blueviolet", "deeppink") # Colores
plot(moon1, col=color, pch=19, main = "Método Centroid")
Análogo a lo que ha venido ocurriendo el mejor m’etodo terminó siendo el Single. Así pues queda más que demostrado que para casos donde las estructuras sean alargadas el método que nos provee de las mejores herramientas es el método Single.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: H
# Buscamos la distancia
distancia4 = dist(h1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia4, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia4, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia4, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia4, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia4, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia4, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia4, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia4, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Puedieron verse las graficas de los dendográmas para el caso de distancia euclideana.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, h$V5)
##
## t1 1 2 3 4 5
## 1 140 219 214 199 222
## 2 0 0 0 2 0
## 3 0 0 0 0 2
## 4 0 0 0 0 1
## 5 0 0 0 0 1
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, h$V5)
##
## t2 1 2 3 4 5
## 1 0 2 103 50 0
## 2 140 70 0 112 51
## 3 0 0 68 39 0
## 4 0 71 5 0 82
## 5 0 76 38 0 93
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, h$V5)
##
## t3 1 2 3 4 5
## 1 0 14 101 47 0
## 2 89 25 0 86 19
## 3 0 1 101 31 0
## 4 0 95 12 0 126
## 5 51 84 0 37 81
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Average", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, h$V5)
##
## t4 1 2 3 4 5
## 1 0 19 165 8 0
## 2 50 57 0 10 46
## 3 0 32 45 0 93
## 4 0 0 4 145 1
## 5 90 111 0 38 86
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, h$V5)
##
## t5 1 2 3 4 5
## 1 0 1 175 83 0
## 2 43 22 0 80 19
## 3 0 76 7 0 66
## 4 0 62 32 0 69
## 5 97 58 0 38 72
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, h$V5)
##
## t6 1 2 3 4 5
## 1 0 31 193 0 0
## 2 60 0 1 102 13
## 3 0 0 13 47 0
## 4 28 187 7 0 187
## 5 52 1 0 52 26
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, h$V5)
##
## t7 1 2 3 4 5
## 1 104 42 102 138 38
## 2 11 0 28 63 13
## 3 0 5 76 0 0
## 4 25 94 0 0 131
## 5 0 78 8 0 44
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, h$V5)
##
## t8 1 2 3 4 5
## 1 0 0 31 45 0
## 2 81 17 6 119 18
## 3 0 1 93 0 0
## 4 0 19 77 0 0
## 5 59 182 7 37 208
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Centroid", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Como puede observarse ningún método puede considerarse como bueno, así pues de entre todos de los menos malos están el de Wad.D, cuya matriz de confusión pareciese no ser tan mala. Similar ocurre con el método de McQuitty.
# Set de datos: H
# Buscamos la distancia
distancia4 = dist(h1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia4, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia4, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia4, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia4, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia4, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia4, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia4, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia4, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse la graficación de los diferentes dendográmas.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, h$V5)
##
## t1 1 2 3 4 5
## 1 140 219 214 201 215
## 2 0 0 0 0 2
## 3 0 0 0 0 1
## 4 0 0 0 0 7
## 5 0 0 0 0 1
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, h$V5)
##
## t2 1 2 3 4 5
## 1 0 5 120 101 0
## 2 60 34 0 36 20
## 3 0 19 94 0 10
## 4 0 147 0 0 167
## 5 80 14 0 64 29
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, h$V5)
##
## t3 1 2 3 4 5
## 1 0 0 9 45 0
## 2 51 23 0 83 19
## 3 0 20 198 36 0
## 4 0 112 7 0 119
## 5 89 64 0 37 88
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Average", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, h$V5)
##
## t4 1 2 3 4 5
## 1 46 6 32 163 3
## 2 0 20 175 0 0
## 3 45 135 7 2 122
## 4 49 24 0 36 29
## 5 0 34 0 0 72
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, h$V5)
##
## t5 1 2 3 4 5
## 1 0 0 21 90 0
## 2 83 29 0 75 31
## 3 0 20 186 0 0
## 4 0 146 7 0 179
## 5 57 24 0 36 16
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, h$V5)
##
## t6 1 2 3 4 5
## 1 0 1 183 31 0
## 2 75 20 1 108 31
## 3 65 14 0 62 20
## 4 0 84 7 0 113
## 5 0 100 23 0 62
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, h$V5)
##
## t7 1 2 3 4 5
## 1 139 59 201 155 25
## 2 0 0 0 19 22
## 3 1 47 7 0 56
## 4 0 113 6 0 123
## 5 0 0 0 27 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, h$V5)
##
## t8 1 2 3 4 5
## 1 0 0 18 46 0
## 2 140 194 6 155 225
## 3 0 5 100 0 0
## 4 0 20 90 0 0
## 5 0 0 0 0 1
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Centroid", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Hubieron algunos casos dónde los métodos empeoraron apreciativamente (ejemplo, método Centroid), en otros casos, por otro lado, mejoró bastante. En este punto puede considerarse como el mejor método para tratar con el set de datos el Ward.D2, aunque se debe tener en cuenta que la tasa de errores no es despreciable.
# Set de datos: H
# Buscamos la distancia
distancia4 = dist(h1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia4, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia4, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia4, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia4, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia4, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia4, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia4, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia4, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse los diferentes gráficos de los dendográmas, pasaremos pues a verificar las soluciones con ayuda de la matriz de confusión.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, h$V5)
##
## t1 1 2 3 4 5
## 1 140 219 214 201 220
## 2 0 0 0 0 2
## 3 0 0 0 0 1
## 4 0 0 0 0 1
## 5 0 0 0 0 2
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, h$V5)
##
## t2 1 2 3 4 5
## 1 0 0 87 39 0
## 2 63 71 22 23 94
## 3 0 0 0 103 0
## 4 0 72 105 0 46
## 5 77 76 0 36 86
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, h$V5)
##
## t3 1 2 3 4 5
## 1 0 0 109 46 0
## 2 81 74 0 87 48
## 3 0 0 0 67 4
## 4 0 73 105 0 101
## 5 59 72 0 1 73
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Average", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, h$V5)
##
## t4 1 2 3 4 5
## 1 0 19 179 18 0
## 2 96 0 6 177 4
## 3 3 49 0 6 66
## 4 0 41 29 0 83
## 5 41 110 0 0 73
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, h$V5)
##
## t5 1 2 3 4 5
## 1 0 19 185 41 0
## 2 75 0 0 86 0
## 3 60 27 0 68 4
## 4 5 132 0 6 120
## 5 0 41 29 0 102
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, h$V5)
##
## t6 1 2 3 4 5
## 1 0 38 201 23 0
## 2 0 0 0 166 0
## 3 48 59 0 5 49
## 4 0 58 13 0 100
## 5 92 64 0 7 77
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, h$V5)
##
## t7 1 2 3 4 5
## 1 0 0 143 6 0
## 2 137 51 4 190 6
## 3 3 163 67 0 96
## 4 0 0 0 5 33
## 5 0 5 0 0 91
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, h$V5)
##
## t8 1 2 3 4 5
## 1 140 219 208 113 206
## 2 0 0 6 67 0
## 3 0 0 0 21 0
## 4 0 0 0 0 19
## 5 0 0 0 0 1
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(h$V1, # x axis
h$V2, # y axis
h$V3, # z axis
main="Método Centroid", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Análogo a lo que ha venido ocurriendo, hubieron casos para los que empeoró (de nuevo, método Centroid), aunque se resalta que no pareció mejorar apreciativamente para ninguno de los métodos. Así pues se considera hasta este punto que uno de los mejores métodos fue Ward.D2 con distancia Maximum.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: HELP
# Buscamos la distancia
distancia5 = dist(help1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia5, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia5, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia5, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia5, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia5, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia5, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia5, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia5, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Puedieron verse las graficas de los dendográmas para el caso de distancia euclideana.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
table(t1, help$V5)
##
## t1 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 425
## 3 0 0 0 2
## 4 506 494 0 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
table(t2, help$V5)
##
## t2 1 2 3 4
## 1 501 30 0 0
## 2 5 464 94 38
## 3 42 30 449 389
## 4 464 494 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
table(t3, help$V5)
##
## t3 1 2 3 4
## 1 503 15 0 0
## 2 3 479 0 0
## 3 0 30 543 371
## 4 506 494 0 56
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
table(t4, help$V5)
##
## t4 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 495 8 0 0
## 4 11 486 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
table(t5, help$V5)
##
## t5 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 378
## 3 506 26 0 49
## 4 0 468 0 0
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
table(t6, help$V5)
##
## t6 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 497 7 0 0
## 4 9 487 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
table(t7, help$V5)
##
## t7 1 2 3 4
## 1 501 16 0 0
## 2 5 508 543 427
## 3 501 16 0 0
## 4 5 478 0 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
table(t8, help$V5)
##
## t8 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 503 15 0 0
## 4 3 479 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Como puede observarse ningún método puede considerarse como bueno, como ya se mencionó con anterioridad se debe a la forma en la que las clases están, si se pudiese separa cada letra como un cluster propio y tal vez separar estos a su vez y trabajar cada estructura por separado el resultado podría ser mejor.
Si se consiguiese separar cada letra como cluster el ganador indiscutible sería Single, pero dada la estructura como es, no se puede recomendar ninguno. La tasa de error siendo tan alta como la de acierto (y en ocaciones incluso más alta) es absurdo.
# Set de datos: HELP
# Buscamos la distancia
distancia5 = dist(help1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia5, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia5, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia5, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia5, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia5, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia5, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia5, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia5, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse la graficación de los diferentes dendográmas.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
table(t1, help$V5)
##
## t1 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 425
## 3 0 0 0 2
## 4 506 494 0 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
table(t2, help$V5)
##
## t2 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 503 40 0 0
## 4 3 454 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
table(t3, help$V5)
##
## t3 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 506 129 0 0
## 4 0 365 0 0
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
table(t4, help$V5)
##
## t4 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 506 27 0 0
## 4 0 467 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
table(t5, help$V5)
##
## t5 1 2 3 4
## 1 493 8 0 0
## 2 13 486 0 0
## 3 0 30 543 387
## 4 506 494 0 40
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
table(t6, help$V5)
##
## t6 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 416 0 0 0
## 4 90 494 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
table(t7, help$V5)
##
## t7 1 2 3 4
## 1 506 494 4 0
## 2 488 214 539 400
## 3 0 0 0 27
## 4 18 310 0 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
table(t8, help$V5)
##
## t8 1 2 3 4
## 1 506 494 0 0
## 2 43 30 543 427
## 3 335 0 0 0
## 4 128 494 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Como en el caso de la distancia euclidean, los resultados obtenido resultan pobres, como ya se mencionó, se mantiene la idea de que una opción para tratar con este set de datos está en convertirlo en set de datos separados y estudiarlos cada uno como una estructura.
Cabe destacar que para el caso de sitancia Maximum los resultados tienden a parecere a los mismos que se obtuvieron por medio del algoritmo K-Means, con algunas obvias exepciones (Single, por ejemplo).
# Set de datos: HELP
# Buscamos la distancia
distancia5 = dist(help1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia5, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia5, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia5, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia5, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia5, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia5, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia5, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia5, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse los diferentes gráficos de los dendográmas, pasaremos pues a verificar las soluciones con ayuda de la matriz de confusión.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
table(t1, help$V5)
##
## t1 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 425
## 3 0 0 0 2
## 4 506 494 0 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
table(t2, help$V5)
##
## t2 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 506 84 0 0
## 4 0 410 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
table(t3, help$V5)
##
## t3 1 2 3 4
## 1 506 93 0 0
## 2 0 401 0 0
## 3 0 30 543 427
## 4 506 494 0 0
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
table(t4, help$V5)
##
## t4 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 499 10 0 0
## 4 7 484 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
table(t5, help$V5)
##
## t5 1 2 3 4
## 1 506 494 0 0
## 2 0 30 543 427
## 3 506 93 0 0
## 4 0 401 0 0
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
table(t6, help$V5)
##
## t6 1 2 3 4
## 1 506 494 0 0
## 2 171 30 543 427
## 3 248 0 0 0
## 4 87 494 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
table(t7, help$V5)
##
## t7 1 2 3 4
## 1 429 0 0 0
## 2 77 494 0 0
## 3 429 30 543 427
## 4 77 494 0 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
table(t8, help$V5)
##
## t8 1 2 3 4
## 1 506 70 0 0
## 2 0 424 0 0
## 3 0 30 543 427
## 4 506 494 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(help$V1, # x axis
help$V2, # y axis
help$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Como ha venido ocurriendo, ningun método puede ser considerado como bueno. En ninguno de los casos observados hasta ahora ambas Ss fueron incluídas dentro del mismo cluster, sólo con eso se puede llegar a ver cuán grande la tasa de error llega a ser sin necesidad de ver las diferentes matrices de confusión.
Si se pudiese separar el set en tres, sería, posiblemente, mucho más facil de estudiar. Así como está, resultó imposible hayar un método aceptable.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: S
# Buscamos la distancia
distancia6 = dist(s1, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia6, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia6, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia6, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia6, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia6, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia6, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia6, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia6, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Puedieron verse las graficas de los dendográmas para el caso de distancia euclideana.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, s$V5)
##
## t1 1 2 3 4 5
## 1 75 214 227 393 84
## 2 0 0 0 2 0
## 3 0 0 0 2 0
## 4 0 1 0 0 0
## 5 0 0 0 2 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, s$V5)
##
## t2 1 2 3 4 5
## 1 0 0 194 60 0
## 2 0 0 0 159 46
## 3 0 0 0 180 38
## 4 52 116 21 0 0
## 5 23 99 12 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, s$V5)
##
## t3 1 2 3 4 5
## 1 0 0 14 238 0
## 2 0 0 168 7 0
## 3 0 0 0 154 84
## 4 75 114 0 0 0
## 5 0 101 45 0 0
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, s$V5)
##
## t4 1 2 3 4 5
## 1 0 0 70 134 0
## 2 0 0 0 153 0
## 3 0 0 0 112 84
## 4 0 44 152 0 0
## 5 75 171 5 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, s$V5)
##
## t5 1 2 3 4 5
## 1 0 0 182 45 0
## 2 0 0 0 219 0
## 3 0 0 0 135 84
## 4 75 114 0 0 0
## 5 0 101 45 0 0
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, s$V5)
##
## t6 1 2 3 4 5
## 1 0 0 14 245 0
## 2 0 70 201 14 0
## 3 0 0 0 140 84
## 4 75 83 0 0 0
## 5 0 62 12 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, s$V5)
##
## t7 1 2 3 4 5
## 1 0 0 6 172 0
## 2 0 43 209 18 0
## 3 0 0 0 165 84
## 4 75 172 12 0 0
## 5 0 0 0 44 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, s$V5)
##
## t8 1 2 3 4 5
## 1 0 0 8 230 0
## 2 0 0 45 25 0
## 3 0 97 174 0 0
## 4 0 0 0 144 84
## 5 75 118 0 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
Como puede observarse la S representa una estructura algo complicada, se pueden ver algunos resultados no tan malos, por ejmplo, el del método Avarege, en el cual algunos de los clusters guardan cierto parecido con la clase original (similar a los métodos Ward.D y Ward.D2 los cuales tampoco están tan mal), al mismo tiempo podemos encontrarnos unos pésimos como el del método Single.
Aunque el resultado optenido aparenta ser mejor que el conseguido mediante K-Means.
# Set de datos: S
# Buscamos la distancia
distancia6 = dist(s1, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia6, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia6, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia6, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia6, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia6, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia6, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia6, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia6, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse la graficación de los diferentes dendográmas cuando la distancia es Maximum.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, s$V5)
##
## t1 1 2 3 4 5
## 1 75 209 227 394 84
## 2 0 0 0 2 0
## 3 0 0 0 1 0
## 4 0 6 0 0 0
## 5 0 0 0 2 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, s$V5)
##
## t2 1 2 3 4 5
## 1 0 0 70 149 0
## 2 0 0 0 173 0
## 3 0 0 0 77 84
## 4 0 113 157 0 0
## 5 75 102 0 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, s$V5)
##
## t3 1 2 3 4 5
## 1 0 0 16 137 0
## 2 0 0 0 162 0
## 3 0 100 211 2 0
## 4 0 0 0 98 84
## 5 75 115 0 0 0
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, s$V5)
##
## t4 1 2 3 4 5
## 1 0 0 22 285 0
## 2 0 0 161 0 0
## 3 0 0 0 114 84
## 4 75 114 0 0 0
## 5 0 101 44 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, s$V5)
##
## t5 1 2 3 4 5
## 1 0 0 100 134 0
## 2 0 0 0 172 0
## 3 0 101 127 0 0
## 4 0 0 0 93 84
## 5 75 114 0 0 0
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, s$V5)
##
## t6 1 2 3 4 5
## 1 0 0 22 180 0
## 2 0 0 0 119 0
## 3 0 88 205 0 0
## 4 0 0 0 100 84
## 5 75 127 0 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, s$V5)
##
## t7 1 2 3 4 5
## 1 0 0 20 385 53
## 2 0 70 206 9 0
## 3 75 145 0 0 0
## 4 0 0 0 5 31
## 5 0 0 1 0 0
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, s$V5)
##
## t8 1 2 3 4 5
## 1 0 0 20 307 0
## 2 0 0 66 0 0
## 3 0 0 95 0 0
## 4 0 0 0 92 84
## 5 75 215 46 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
En algunos casos el cambio en la distancia resultó en uno beneficioso, un ejemplo de esto es el método Ward.D, el cual demostró cierta mejora, si bien aún se equivoca, puede considerarse como el mejor de los métodos hasta el momento usados.
# Set de datos: S
# Buscamos la distancia
distancia6 = dist(s1, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia6, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia6, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia6, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia6, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia6, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia6, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia6, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia6, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse los diferentes gráficos de los dendográmas, pasaremos pues a verificar las soluciones con ayuda de la matriz de confusión cuando la distancia es la Manhattan.
# Matrices de Confusión
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 5)
table(t1, s$V5)
##
## t1 1 2 3 4 5
## 1 75 214 227 370 84
## 2 0 0 0 26 0
## 3 0 0 0 2 0
## 4 0 0 0 1 0
## 5 0 1 0 0 0
colors <- sapply(t1, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 5)
table(t2, s$V5)
##
## t2 1 2 3 4 5
## 1 0 0 18 230 0
## 2 0 39 99 0 0
## 3 0 0 0 169 84
## 4 0 75 110 0 0
## 5 75 101 0 0 0
colors <- sapply(t2, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Complete", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 5)
table(t3, s$V5)
##
## t3 1 2 3 4 5
## 1 0 0 14 95 0
## 2 0 0 0 153 0
## 3 0 5 207 7 0
## 4 0 0 0 144 84
## 5 75 210 6 0 0
colors <- sapply(t3, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Avarege", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 5)
table(t4, s$V5)
##
## t4 1 2 3 4 5
## 1 0 0 22 127 0
## 2 0 0 0 130 0
## 3 0 65 205 0 0
## 4 0 0 0 142 84
## 5 75 150 0 0 0
colors <- sapply(t4, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 5)
table(t5, s$V5)
##
## t5 1 2 3 4 5
## 1 0 0 89 68 0
## 2 0 0 0 179 0
## 3 0 0 0 152 84
## 4 0 65 138 0 0
## 5 75 150 0 0 0
colors <- sapply(t5, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Ward.D2", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 5)
table(t6, s$V5)
##
## t6 1 2 3 4 5
## 1 0 0 14 324 0
## 2 0 36 102 0 0
## 3 0 4 111 18 0
## 4 0 0 0 57 84
## 5 75 175 0 0 0
colors <- sapply(t6, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método McQuitty", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 5)
table(t7, s$V5)
##
## t7 1 2 3 4 5
## 1 0 0 0 164 0
## 2 75 215 227 42 0
## 3 0 0 0 185 52
## 4 0 0 0 3 0
## 5 0 0 0 5 32
colors <- sapply(t7, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Median", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 5)
table(t8, s$V5)
##
## t8 1 2 3 4 5
## 1 0 48 213 19 0
## 2 0 0 0 160 0
## 3 0 0 14 66 0
## 4 0 0 0 154 84
## 5 75 167 0 0 0
colors <- sapply(t8, def_color)
h.plot <- scatterplot3d(s$V1, # x axis
s$V2, # y axis
s$V3, # z axis
main="Método Single", pch = 20, color = colors,
angle = 75, scale.y = .5, cex.symbols = 1.5)
En la mayoría de los casos no implico mejoras mencionable o que algo empeorase demasiado. El mejor método puedeconsiderarse como el Ward.D con distancia Maximum.
Cabe destacar que esto ocurre en parte debido a la cantidad de clsuters, si se hubiese dividido la clase continua en blosques más grandes es posible que los métodos como Ward.D y Ward.D2 hubiesen hecho un mucho mejor trabajo a la hora de buscar a qué cluster pertenecía cada individuo.
Sería interesante el estudio del mismo set de datos con clases discretas diferentes a las actuales, una reducción en el número, puede ser bueno en este caso si se desea ser menos específico pero aumentar la precisión.
Lo primero que es importante resaltar son las diferentes distancias utilizadas cuando se aplican clusterng jerárquico, durante este análisis trabajaremos con varias distancias, para ver cuáles son las mejores opciones.
# Set de datos: Guess
# Buscamos la distancia
distancia7 = dist(guess, method = "euclidean")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia7, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia7, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia7, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia7, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia7, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia7, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia7, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia7, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Puedieron verse las graficas de los dendográmas para el caso de distancia euclideana.
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
colors <- sapply(t1, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
colors <- sapply(t2, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
colors <- sapply(t3, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
colors <- sapply(t4, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
colors <- sapply(t5, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
colors <- sapply(t6, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
colors <- sapply(t7, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
colors <- sapply(t8, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Centroid")
Es interesante ver este set de datos cuando le son aplicados diferentes métodos ya que podemos comenzar a entender la razón de que el códo de Jambú haya indicado que en efecto el óptimo número para este set de datos estab aentre 4~5.
De todos los gráficos mostrados, el que me parece más lógico me parece que es el que vine dado por el método Ward.D.
La razón detrás de esto es que me parece que la forma de la nube al aplicarle este método de clustering tiene más sentido desde una perspectiva personal. Así pues, si bien no se puede provar debido a que no se le pueden aplicar métodos predictivos al resultado de la función hclust, sería interesante ver cuán bueno es si se pudiese hacer la comparación con K-Means.
Se resalta que hasta ahora ninguno de las gráficas generadas tiene parecido con la hecha mediante K-Means.
# Set de datos: Guess
# Buscamos la distancia
distancia7 = dist(guess, method = "maximum")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia7, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia7, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia7, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia7, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia7, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia7, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia7, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia7, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse la graficación de los diferentes dendográmas cuando la distancia es Maximum.
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
colors <- sapply(t1, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
colors <- sapply(t2, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
colors <- sapply(t3, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
colors <- sapply(t4, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
colors <- sapply(t5, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
colors <- sapply(t6, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
colors <- sapply(t7, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
colors <- sapply(t8, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Centroid")
En su momento se habló de que el método que resultaba, personalmente, más atractivo era el Ward.D, si se aplica distancia Maximum puede verse como el método Complete tiende a parecerse al método Ward.D, este a su vez no pierde su forma y parece bastante similar, en el caso del método Ward.D2 ocurre algo similar al de Complete.
Cabe destacar que el método Ward.D, así como Ward.D2 funcionan en base de buscar óptimos valores a funciones objetivos, estas funciones tiende a ser el SSE (Sum of Squared Error, suma del cuadrado de los errores), como dato interesante esto guarda cierto relación con el método de Jambú el cual también funciona a base de minimizar el SSE.
También se sabe que en el caso de la distancia Maximum, ésta funciona bien en casos donde las nubes de punto no estén separadas.
# Set de datos: Guess
# Buscamos la distancia
distancia7 = dist(guess, method = "manhattan")
# Aplicando hclust
# Utilizando el método single
cluster1 = hclust(distancia7, method = "single")
plot(cluster1, main = "Cluster de Moon: Método Single", col = "blueviolet")
# Utilizando el método complete
cluster2 = hclust(distancia7, method = "complete")
plot(cluster2, main = "Cluster de Moon: Método Complete", col = "blueviolet")
# Utilizando el método average
cluster3 = hclust(distancia7, method = "average")
plot(cluster3, main = "Cluster de Moon: Método Average", col = "blueviolet")
# Utilizando el método ward.D
cluster4 = hclust(distancia7, method = "ward.D")
plot(cluster4, main = "Cluster de Moon: Método Ward.D", col = "blueviolet")
# Utilizando el método ward.D2
cluster5 = hclust(distancia7, method = "ward.D2")
plot(cluster5, main = "Cluster de Moon: Método Ward.D2", col = "blueviolet")
# Utilizando el método mcquitty
cluster6 = hclust(distancia7, method = "mcquitty")
plot(cluster6, main = "Cluster de A: Método Mcquitty", col = "blueviolet")
# Utilizando el método median
cluster7 = hclust(distancia7, method = "median")
plot(cluster7, main = "Cluster de Moon: Método Median", col = "blueviolet")
# Utilizando el método centroid
cluster8 = hclust(distancia7, method = "centroid")
plot(cluster8, main = "Cluster de Moon: Método Centroid", col = "blueviolet")
Pueden verse los diferentes gráficos de los dendográmas, pasaremos pues a verificar las soluciones con ayuda de la matriz de confusión cuando la distancia es la Manhattan.
# Matriz de confusión usando el método Single
t1=cutree(cluster1, k = 4)
colors <- sapply(t1, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Single")
# Matriz de confusión usando el método complete
t2=cutree(cluster2, k = 4)
colors <- sapply(t2, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Complete")
# Matriz de confusión usando el método average
t3=cutree(cluster3, k = 4)
colors <- sapply(t3, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Average")
# Matriz de confusión usando el método ward.D
t4=cutree(cluster4, k = 4)
colors <- sapply(t4, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D")
# Matriz de confusión usando el método ward.D2
t5=cutree(cluster5, k = 4)
colors <- sapply(t5, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Ward.D2")
# Matriz de confusión usando el método mcquitty
t6=cutree(cluster6, k = 4)
colors <- sapply(t6, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método McQuitty")
#Matriz de confusión usando el método median
t7=cutree(cluster7, k = 4)
colors <- sapply(t7, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Median")
#Matriz de confusión usando el método centroid
t8=cutree(cluster8, k = 4)
colors <- sapply(t8, def_color)
plot(x = guess$V1, y = guess$V2, col = colors, pch = 20, main = "Método Centroid")
Debido a las características de la distancia Manhathan es interesante el observar el resultado obtenido luego de aplicar el clustering jerárquico. Más que nada porque con distancias como la Manhathan se trata my bien en el caso donde hay datos con outliers (valores atípicos), se puede ver como los gáficos generados con esta distancia son bastante particulares y a lo largo del estudio se ha hecho obvio que en muchos casos no parece ser tan bueno como el uso de sistancias como la Maximum la cual como se ha dcho funciona especialmente bien cuando las nubes de puntos estan unidas o la Euclideana que es beneficiosa para casos donde los puntos tengan formas elípticas y esten separados su importancia real. Resulta innegable, sin embargo, su importancia (distancia Manhathan) debido a la complicaciones que significa trabajar con valores atípicos.